﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using wrapper;

namespace SpaceBattleWPF
{
    

    /// <summary>
    /// Logique d'interaction pour Jeu.xaml
    /// </summary>
    public partial class FenetreJeu : Window
    {
        
        WrapperFacade f;
        Button[,] tabBoutton;
        int de1;
        int de2;
        Boolean[,] btnAccessibles;
        Boolean peutLancerDes;

        //Variables globales utilisées pour le tir
        int modeTir = 0;
        Line dirTir = new Line();
        Line[] laser;
        double xCaseCouranteTir = 0;
        double yCaseCouranteTir = 0;


        public FenetreJeu()
        {
            InitializeComponent();
            initialiseTableauBouton();
            initTir();
            
            Grid.SetZIndex(jeu, (int)0.2);

            peutLancerDes = true;
            
        }

        /**
         * Lors d'un clique sur une case du plateau
         */
        private void ClickBouton(object sender, EventArgs e)
        {
           
                Button clicked = (Button)sender;
            //On récupère les coordonnées de la case cliquée
                int y = Grid.GetColumn(clicked);
                int x = Grid.GetRow(clicked);

            //Si la case est accessible
                if (btnAccessibles[y, x])
                {
                    //On rétablie l'affichage des cases qui ne sont plus accessibles après le déplacement
                    LinkedList<int> listA = f.getCasesAccessibles(de1, de2);

                    int a = -1;
                    foreach (int type in listA)
                    {
                        if (a == -1) a = type;
                        else
                        {
                            tabBoutton[a, type].Opacity = 0;
                            a = -1;
                        }
                    }
                    deplacer(y, x);
                    initCasesAccessibles();
                }
            
        }
        
        /**
         * Initialisation des cases du plateau en fonction de leur spécificité
         */
        public void initCase(int nbLignes, int nbColonnes)
        {
            LinkedList<int> pl = f.getCases();
            initCasesAccessibles();
            Grid.SetZIndex(VMRouge, (int)90);
            Grid.SetZIndex(VMVert, (int)90);
            Grid.SetZIndex(VMJaune, (int)90);
            Grid.SetZIndex(VMBleu, (int)90);
            Grid.SetZIndex(BCRouge, (int)90);
            Grid.SetZIndex(BCVert, (int)90);
            Grid.SetZIndex(BCJaune, (int)90);
            Grid.SetZIndex(BCBleu, (int)90);
            Grid.SetZIndex(CSRouge, (int)90);
            Grid.SetZIndex(CSVert, (int)90);
            Grid.SetZIndex(CSJaune, (int)90);
            Grid.SetZIndex(CSBleu, (int)90);
            ////Création des Cases (boutons)
            for (int i = 0; i < nbColonnes; i++)
            {
                for (int j = 0; j < nbLignes; j++)
                {
                    Grid.SetZIndex(tabBoutton[i, j], (int)80);
                    int cas = pl.ElementAt(i + j*nbColonnes); //Type de la case
                    if ( cas== 1)//asteroide
                    {
                        Image asteroid = new Image();
                        asteroid.Source = new BitmapImage(new Uri("./Resources/asteroide.png", UriKind.Relative));
                        plateau.Children.Add(asteroid);
                        Grid.SetRow(asteroid, j);
                        Grid.SetColumn(asteroid, i);
                    }
                    if (cas == 2)//artefact
                    {
                        Image artefact = new Image();
                        artefact.Source = new BitmapImage(new Uri("./Resources/tresor.jpg", UriKind.Relative));
                        plateau.Children.Add(artefact);
                        Grid.SetRow(artefact, j);
                        Grid.SetColumn(artefact, i);
                        Grid.SetZIndex(artefact,(int)70);
                        
                    }
                    if (cas == 3)//station energie
                    {
                        Image energie = new Image();
                        energie.Source = new BitmapImage(new Uri("./Resources/energie.jpg", UriKind.Relative));
                        plateau.Children.Add(energie);
                        Grid.SetRow(energie, j);
                        Grid.SetColumn(energie, i);
                        Grid.SetZIndex(energie, (int)70);
                    }

                    if (cas == 4||cas == 5||cas == 6||cas == 7)//station orbitale
                    {
                        Grid.SetZIndex(tabBoutton[i, j], (int)70);
                    }
                }
            }
        }

        /* Initialise le tableau de bouton du plateau */
        public void initialiseTableauBouton()
        {
            Button[,] tmp =    { 
                                    { Bout0_0 , Bout0_1 , Bout0_2 , Bout0_3 , Bout0_4 , Bout0_5 , Bout0_6 , Bout0_7 },
                                    { Bout1_0 , Bout1_1 , Bout1_2 , Bout1_3 , Bout1_4 , Bout1_5 , Bout1_6 , Bout1_7 },
                                    { Bout2_0 , Bout2_1 , Bout2_2 , Bout2_3 , Bout2_4 , Bout2_5 , Bout2_6 , Bout2_7 },
                                    { Bout3_0 , Bout3_1 , Bout3_2 , Bout3_3 , Bout3_4 , Bout3_5 , Bout3_6 , Bout3_7 },
                                    { Bout4_0 , Bout4_1 , Bout4_2 , Bout4_3 , Bout4_4 , Bout4_5 , Bout4_6 , Bout4_7 },
                                    { Bout5_0 , Bout5_1 , Bout5_2 , Bout5_3 , Bout5_4 , Bout5_5 , Bout5_6 , Bout5_7 },
                                    { Bout6_0 , Bout6_1 , Bout6_2 , Bout6_3 , Bout6_4 , Bout6_5 , Bout6_6 , Bout6_7 },
                                    { Bout7_0 , Bout7_1 , Bout7_2 , Bout7_3 , Bout7_4 , Bout7_5 , Bout7_6 , Bout7_7 },
                                    { Bout8_0 , Bout8_1 , Bout8_2 , Bout8_3 , Bout8_4 , Bout8_5 , Bout8_6 , Bout8_7 },
                                    { Bout9_0 , Bout9_1 , Bout9_2 , Bout9_3 , Bout9_4 , Bout9_5 , Bout9_6 , Bout9_7 },
                                    { Bout10_0 , Bout10_1 , Bout10_2 , Bout10_3 , Bout10_4 , Bout10_5 , Bout10_6 , Bout10_7 }
                                };
            tabBoutton = tmp;
        }

        /*
         * Permet d'initialiser toutes les cases à non accessibles (fonction appelée après le déplacement)
         */
        public void initCasesAccessibles()
        {
            Boolean[,] casesAccessibles = {
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false },
                                    { false , false , false , false , false , false , false , false }
                                };
            btnAccessibles = casesAccessibles;
        }

        /*
         * Initialise les joueurs avec leur couleurs
         */
        public void initJoueur(String j1, String j2, String j3, String j4, String c1, String c2, String c3, String c4, int nbreJoueurs)
        {
            changeFondPlateau(c1);
            

            if (nbreJoueurs == 2)
            {
                f = new WrapperFacade(2);
                initCase(8, 11);
                f.ajoute2Joueurs(j1, j2, c1, c2, c3, c4);//c1 et c2 sont les couleurs du joueur 1
                if (c1 == "Vert" || c2 == "Vert") nomJVert.Content = j1;
                if (c1 == "Rouge"||c2 == "Rouge") nomJRouge.Content = j1; 
                if (c1 == "Jaune"||c2 == "Jaune") nomJJaune.Content = j1;
                if (c1 == "Bleu"||c2 == "Bleu") nomJBleu.Content = j1;
                if (c3 == "Vert" || c4 == "Vert") nomJVert.Content = j2;
                if (c3 == "Rouge"||c4 == "Rouge") nomJRouge.Content = j2; 
                if (c3 == "Jaune"||c4 == "Jaune") nomJJaune.Content = j2;
                if (c3 == "Bleu"||c4 == "Bleu") nomJBleu.Content = j2;
                
                infoFlotte(c1);
                infoFlotte(c2);
                infoFlotte(c3);
                infoFlotte(c4);
             }

            if (nbreJoueurs == 3)
            {
                f = new WrapperFacade(3);
                initCase(8, 11);
                f.ajoute3Joueurs(j1, j2, j3, c1, c2, c3);
                if (c1 == "Vert") nomJVert.Content = j1;
                if (c1 == "Rouge") nomJRouge.Content = j1;
                if (c1 == "Jaune") nomJJaune.Content = j1;
                if (c1 == "Bleu") nomJBleu.Content = j1;
                if (c2 == "Vert") nomJVert.Content = j2;
                if (c2 == "Rouge") nomJRouge.Content = j2;
                if (c2 == "Jaune") nomJJaune.Content = j2;
                if (c2 == "Bleu") nomJBleu.Content = j2;
                if (c3 == "Vert") nomJVert.Content = j3;
                if (c3 == "Rouge") nomJRouge.Content = j3;
                if (c3 == "Jaune") nomJJaune.Content = j3;
                if (c3 == "Bleu") nomJBleu.Content = j3;
                if (c1 != "Bleu" && c2 != "Bleu" && c3 != "Bleu")
                {
                    infoBleu.Visibility = System.Windows.Visibility.Hidden;
                    VMBleu.Visibility = System.Windows.Visibility.Hidden;
                }
                if (c1 != "Jaune" && c2 != "Jaune" && c3 != "Jaune")
                {
                    infoJaune.Visibility = System.Windows.Visibility.Hidden;
                    VMJaune.Visibility = System.Windows.Visibility.Hidden;
                }
                if (c1 != "Rouge" && c2 != "Rouge" && c3 != "Rouge")
                {
                    infoRouge.Visibility = System.Windows.Visibility.Hidden;
                    VMRouge.Visibility = System.Windows.Visibility.Hidden;
                }
                if (c1 != "Vert" && c2 != "Vert" && c3 != "Vert")
                {
                    infoVert.Visibility = System.Windows.Visibility.Hidden;
                    VMVert.Visibility = System.Windows.Visibility.Hidden;
                }
                infoFlotte(c1);
                infoFlotte(c2);
                infoFlotte(c3);
            }
            if (nbreJoueurs == 4)
            {
                f = new WrapperFacade(4);
                initCase(8, 11);
                f.ajoute4Joueurs(j1, j2, j3, j4, c1, c2, c3, c4);
                if (c1 == "Vert") nomJVert.Content = j1;
                if (c1 == "Rouge") nomJRouge.Content = j1;
                if (c1 == "Jaune") nomJJaune.Content = j1;
                if (c1 == "Bleu") nomJBleu.Content = j1;
                if (c2 == "Vert") nomJVert.Content = j2;
                if (c2 == "Rouge") nomJRouge.Content = j2;
                if (c2 == "Jaune") nomJJaune.Content = j2;
                if (c2 == "Bleu") nomJBleu.Content = j2;
                if (c3 == "Vert") nomJVert.Content = j3;
                if (c3 == "Rouge") nomJRouge.Content = j3;
                if (c3 == "Jaune") nomJJaune.Content = j3;
                if (c3 == "Bleu") nomJBleu.Content = j3;
                if (c4 == "Vert") nomJVert.Content = j4;
                if (c4 == "Rouge") nomJRouge.Content = j4;
                if (c4 == "Jaune") nomJJaune.Content = j4;
                if (c4 == "Bleu") nomJBleu.Content = j4;
                infoFlotte(c1);
                infoFlotte(c2);
                infoFlotte(c3);
                infoFlotte(c4);
            }
            
        }
        
        /**
         * Rend les informations concernant la flotte
         */
        void infoFlotte(String couleur)
        {
            LinkedList<int> info = f.getInfoFlotte(couleur);
            /*int posL = info.ElementAt(0);
            int posC = info.ElementAt(1);*/
            int typeV = info.ElementAt(2);
            String typeVaisseau = "VAISSEAU MÈRE";
            if (typeV == 1) typeVaisseau = "BATTLECRUISER";
            if (typeV == 2) typeVaisseau = "CAPSULE DE SURVIE";
            if (info.ElementAt(6) == 1) typeVaisseau = "FLOTTE DÉTRUITE";
            int nbrArtefact = info.ElementAt(3);
            int aArtefact = info.ElementAt(4);
            int nbrCharge = info.ElementAt(5);
            
            if (couleur == "Rouge")
            {
                NARouge.Content = nbrArtefact;
                NCRouge.Content = nbrCharge;
                PARouge.Content = aArtefact;
                TVRouge.Content = typeVaisseau;
            }
            if (couleur=="Vert")
            {
                NAVert.Content = nbrArtefact;
                NCVert.Content = nbrCharge;
                PAVert.Content = aArtefact;
                TVVert.Content = typeVaisseau;
            }
            if (couleur == "Jaune")
            {
                NAJaune.Content = nbrArtefact;
                NCJaune.Content = nbrCharge;
                PAJaune.Content = aArtefact;
                TVJaune.Content = typeVaisseau;
            }
            if (couleur == "Bleu")
            {
                NABleu.Content = nbrArtefact;
                NCBleu.Content = nbrCharge;
                PABleu.Content = aArtefact;
                TVBleu.Content = typeVaisseau;
            }        
            
        }

//*****FONCTIONS POUR LE TIR*****(début)

        public void initTir()
        {
            // Initialisation du "trait" permettant de viser (pour le tir)
            dirTir.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
            dirTir.X1 = 0;
            dirTir.X2 = 0;
            dirTir.Y1 = 0;
            dirTir.Y2 = 0;
            dirTir.StrokeThickness = 2;
            dirTir.PreviewMouseLeftButtonDown += DeclancherTir;
            dirTir.MouseMove += PositionSourisTir;
            jeu.Children.Add(dirTir);

            Line[] ttmp = { new Line(), new Line(), new Line(), new Line(), new Line(), new Line(), new Line()};
            laser = ttmp;
            for (int i = 0; i < 7; i++)
            {
                laser[i].X1 = 0;
                laser[i].X2 = 0;
                laser[i].Y1 = 0;
                laser[i].Y2 = 0;
                laser[i].StrokeThickness = 2;
                jeu.Children.Add(laser[i]);
            }
            // Ligne au premier plan
            //Grid.SetZIndex(plateau, (int)98);
            //Grid.SetZIndex(dirTir, (int)99);
        }


        private void DeclancherTir(object sender, MouseButtonEventArgs e)
        {
            if (modeTir == 1)
            {
                String couleur = f.couleurVaisseauCourant();
                double orig_x, orig_y, dest_x, dest_y;
                orig_x = (dirTir.X1-179 - plateau.Margin.Left) * f.largeurPlateau() / plateau.ActualWidth;
                orig_y = (dirTir.Y1 - plateau.Margin.Top) * f.hauteurPlateau() / plateau.ActualHeight;
                dest_x = (dirTir.X2-179 - plateau.Margin.Left) * f.largeurPlateau() / plateau.ActualWidth;
                dest_y = (dirTir.Y2 - plateau.Margin.Top) * f.hauteurPlateau() / plateau.ActualHeight;
                
                LinkedList<double> list_points = f.calculTrajectoireMissile(orig_x, orig_y, dest_x, dest_y);
                for (int i = 0; i < list_points.Count-2; i+=2)
                {
                    if (couleur == "Rouge") laser[i / 2].Stroke = System.Windows.Media.Brushes.Red;
                    if (couleur == "Vert" ) laser[i / 2].Stroke = System.Windows.Media.Brushes.Green;
                    if (couleur == "Jaune") laser[i / 2].Stroke = System.Windows.Media.Brushes.Yellow;
                    if (couleur == "Bleu" ) laser[i / 2].Stroke = System.Windows.Media.Brushes.Blue;
                    laser[i / 2].X1 = plateau.ActualWidth * list_points.ElementAt(i) / f.largeurPlateau() + plateau.Margin.Left;
                    laser[i / 2].X2 = plateau.ActualWidth * list_points.ElementAt(i + 2) / f.largeurPlateau() + plateau.Margin.Left;
                    laser[i / 2].Y1 = plateau.ActualHeight * list_points.ElementAt(i + 1) / f.hauteurPlateau() + plateau.Margin.Top;
                    laser[i / 2].Y2 = plateau.ActualHeight * list_points.ElementAt(i + 3) / f.hauteurPlateau() + plateau.Margin.Top;
                    laser[i / 2].X1 += 179;
                    laser[i / 2].X2 += 179;
                    laser[i / 2].StrokeThickness = 2;
                    laser[i / 2].Opacity = 1;

                }
                String res = "";
                for (int i = 0; i < list_points.Count; i++)
                {
                    res += list_points.ElementAt(i);
                    if (i % 2 != 0) res += "\n";
                    else res += "  -  ";
                }
                //MessageBox.Show("Feu : " + res);
                //MessageBox.Show("Feu");

                //Changement de l'image du vaisseau touché
                changeImageVaisseaux();

                // Masquer la ligne de mire
                dirTir.SetValue(Line.X2Property, 0.0);
                dirTir.SetValue(Line.Y2Property, 0.0);
                dirTir.SetValue(Line.X1Property, 0.0);
                dirTir.SetValue(Line.Y1Property, 0.0);

                if (f.partieFinie())
                {
                    finJeu();
                }
                infoFlotte(couleur);
                while (!f.flotteSuivante()) ;
                String couleur_nouveau_vaisseau = f.couleurVaisseauCourant();
                changeFondPlateau(couleur_nouveau_vaisseau);
                peutLancerDes = true;
                modeTir = 0;
            }
        }

        // Calcul de la position du point d'origine du trait 'dirTir'
        private void coordonneesCaseCouranteTir()
        {
            //// Ces calculs sont effectués plusieurs fois dans le code 
            //// (--> il faut créer une fonction qui le fait)
            int hauteur = f.hauteurPlateau();
            int largeur = f.largeurPlateau();
            int posCourante = f.posVaisseauCourant();
            int posColonne = posCourante % largeur;
            int posLigne = (posCourante - posColonne) / largeur;
            double largplateau = plateau.ActualWidth;
            double hautplateau = plateau.ActualHeight;
            double largCase = largplateau / largeur; 
            double hautCase = hautplateau / hauteur;
            xCaseCouranteTir = 179+plateau.Margin.Left + ((posColonne + 0.5) * largCase);
            yCaseCouranteTir = plateau.Margin.Top + ((posLigne + 0.5) * hautCase);
        }

        // Appelée dès que la souris bouge sur le plateau
        // Trace le trait 'dirTir' (pour viser)
        private void PositionSourisTir(object sender, MouseEventArgs e)
        {
            if (modeTir == 1)
            {
                if(xCaseCouranteTir == 0 && yCaseCouranteTir == 0)
                {
                    coordonneesCaseCouranteTir();
                }

                double x = e.GetPosition(null).X;
                double y = e.GetPosition(null).Y;
                dirTir.SetValue(Line.X2Property, x);
                dirTir.SetValue(Line.Y2Property, y);
                // Le trait part du milieu de la case courante
                dirTir.SetValue(Line.X1Property, xCaseCouranteTir);
                dirTir.SetValue(Line.Y1Property, yCaseCouranteTir);
            }
            else
            {
                // TODO vérifier qu'ils ne sont pas déjà à 0
                xCaseCouranteTir = 0;
                yCaseCouranteTir = 0;
            }

            //Tests qui fonctionnent
            //MessageBox.Show("Coordonnées souris : " + x + " ; " + y);
        }

 

//*****FONCTIONS POUR LE TIR*****(fin)


        /*
  * Met à jour l'image des flottes
  */
        void changeImageVaisseaux()
        {
            String couleur_courante = f.couleurVaisseauCourant();
            LinkedList<int> infoCourante = f.getInfoFlotte(couleur_courante);
            int typeVCourant = infoCourante.ElementAt(2);

            // Le vaisseau courant rentre a sa station orbitale
            if (typeVCourant == 0)
            {
                if (couleur_courante == "Rouge")
                {
                    CSRouge.Visibility = System.Windows.Visibility.Hidden;
                    BCRouge.Visibility = System.Windows.Visibility.Hidden;
                    VMRouge.Visibility = System.Windows.Visibility.Visible;
                }
                if (couleur_courante == "Vert")
                {
                    VMVert.Visibility = System.Windows.Visibility.Visible;
                    BCVert.Visibility = System.Windows.Visibility.Hidden;
                    CSVert.Visibility = System.Windows.Visibility.Hidden;
                }
                if (couleur_courante == "Jaune")
                {
                    VMJaune.Visibility = System.Windows.Visibility.Visible;
                    BCJaune.Visibility = System.Windows.Visibility.Hidden;
                    CSJaune.Visibility = System.Windows.Visibility.Hidden;
                }
                if (couleur_courante == "Bleu")
                {
                    VMBleu.Visibility = System.Windows.Visibility.Visible;
                    BCBleu.Visibility = System.Windows.Visibility.Hidden;
                    CSBleu.Visibility = System.Windows.Visibility.Hidden;
                }
            }

            // Un vaisseau est touché
            String couleur;
            do
            {
                f.flotteSuivante();
                couleur = f.couleurVaisseauCourant();
                if (f.estTouche(couleur))
                {
                    infoFlotte(couleur);
                    LinkedList<int> info = f.getInfoFlotte(couleur);
                    int typeV = info.ElementAt(2);

                    if (typeV == 1) // VM : devient BC
                    {
                        if (couleur == "Rouge")
                        {
                            VMRouge.Visibility = System.Windows.Visibility.Hidden;
                            BCRouge.Visibility = System.Windows.Visibility.Visible;
                        }
                        if (couleur == "Vert")
                        {
                            VMVert.Visibility = System.Windows.Visibility.Hidden;
                            BCVert.Visibility = System.Windows.Visibility.Visible;
                        }
                        if (couleur == "Jaune")
                        {
                            VMJaune.Visibility = System.Windows.Visibility.Hidden;
                            BCJaune.Visibility = System.Windows.Visibility.Visible;
                        }
                        if (couleur == "Bleu")
                        {
                            VMBleu.Visibility = System.Windows.Visibility.Hidden;
                            BCBleu.Visibility = System.Windows.Visibility.Visible;
                        }
                    }

                    if (typeV == 2) // BC : devient CS
                    {
                        if (couleur == "Rouge")
                        {
                            BCRouge.Visibility = System.Windows.Visibility.Hidden;
                            CSRouge.Visibility = System.Windows.Visibility.Visible;
                        }

                        if (couleur == "Vert")
                        {
                            BCVert.Visibility = System.Windows.Visibility.Hidden;
                            CSVert.Visibility = System.Windows.Visibility.Visible;
                        }

                        if (couleur == "Jaune")
                        {
                            BCJaune.Visibility = System.Windows.Visibility.Hidden;
                            CSJaune.Visibility = System.Windows.Visibility.Visible;
                        }
                        if (couleur == "Bleu")
                        {
                            BCBleu.Visibility = System.Windows.Visibility.Hidden;
                            CSBleu.Visibility = System.Windows.Visibility.Visible;
                        }

                    }

                    if (info.ElementAt(6) == 1) // Mort : disparait
                    {
                        MessageBox.Show("Le vaisseau " + couleur + " a été anéanti !");
                        if (couleur == "Rouge") CSRouge.Visibility = System.Windows.Visibility.Hidden;
                        if (couleur == "Vert") CSVert.Visibility = System.Windows.Visibility.Hidden;
                        if (couleur == "Jaune") CSJaune.Visibility = System.Windows.Visibility.Hidden;
                        if (couleur == "Bleu") CSBleu.Visibility = System.Windows.Visibility.Hidden;
                    }

                    f.setEstToucheFalse();
                }
            } while (couleur_courante != couleur);
        }

        /*
         * Retourne l'image correspondant à la couleur de la flotte
         */
        Image[] getImageVaisseau(String couleur)
        {
            Image[] tab_image = { VMVert , VMVert , VMVert };
            if (couleur == "Vert")
            {
                tab_image[0] = VMVert;
                tab_image[1] = BCVert;
                tab_image[2] = CSVert;
            }
            else
            {
                if (couleur == "Rouge")
                {
                    tab_image[0] = VMRouge;
                    tab_image[1] = BCRouge;
                    tab_image[2] = CSRouge;
                }
                else
                {
                    if (couleur == "Bleu")
                    {
                        tab_image[0] = VMBleu;
                        tab_image[1] = BCBleu;
                        tab_image[2] = CSBleu;
                    }
                    else
                    {
                        tab_image[0] = VMJaune;
                        tab_image[1] = BCJaune;
                        tab_image[2] = CSJaune;
                    }
                }
            }
            return tab_image;
        }

        /*
         * Lance les dés et retourne les cases  accessibles
         */
        private void lancerDes(object sender, RoutedEventArgs e)
        {
            // Effacer les lignes des lasers
            for (int i = 0; i < 7; i++) laser[i].Opacity = 0;
            
            if (peutLancerDes)
            {
                peutLancerDes = false;
                String couleur = f.couleurVaisseauCourant();
                int resDe = f.lancerDes();
                LinkedList<int> info = f.getInfoFlotte(couleur);
                int typeV = info.ElementAt(2);
                de1 = (resDe % 10);
                if (typeV == 0)
                {
                    de2 = (resDe - de1) / 10;
                }
                else
                {
                    de2 = 0;
                }
                Image[] imgDe1 = { imgDe10, imgDe11, imgDe12, imgDe13, imgDe14, imgDe15, imgDe16 };
                Image[] imgDe2 = { imgDe20, imgDe21, imgDe22, imgDe23, imgDe24, imgDe25, imgDe26 };
                for (int i = 0; i < imgDe1.Length; i++)
                {
                    if (i != de1)
                    {
                        imgDe1[i].Visibility = System.Windows.Visibility.Hidden;
                    }
                }
                imgDe1[de1].Visibility = System.Windows.Visibility.Visible;
                for (int i = 0; i < imgDe2.Length; i++)
                {
                    if (i != de2)
                    {
                        imgDe2[i].Visibility = System.Windows.Visibility.Hidden;
                    }
                }
                imgDe2[de2].Visibility = System.Windows.Visibility.Visible;

                int posCourante = f.posVaisseauCourant();
                int posColonne = posCourante % 11;
                int posLigne = (posCourante - posColonne) / 11;

                LinkedList<int> listA = f.getCasesAccessibles(de1, de2);

                bool isCoorX = true;
                int coorX = 0;
                foreach (int coor in listA)
                {

                    if (isCoorX)
                    {
                        coorX = coor;
                        isCoorX = false;
                    }
                    else
                    {
                        tabBoutton[coorX, coor].Opacity = 0.6;
                        btnAccessibles[coorX, coor] = true;
                        isCoorX = true;
                    }
                }

                if (listA.First == null)
                {
                    while (!f.flotteSuivante()) ;
                    changeFondPlateau(f.couleurVaisseauCourant());
                    peutLancerDes = true;
                    
                }
            }
        }

        /**
         * Deplace le vaissseau et change la flotte courante
         */
        private void deplacer(int colonne, int ligne)
        {
            String couleur = f.couleurVaisseauCourant();
            Image[] tab_image = getImageVaisseau(couleur);
            for (int i = 0; i < tab_image.Length; i++)
            {
                Grid.SetRow(tab_image[i], ligne);
                Grid.SetColumn(tab_image[i], colonne);
            }
            f.deplacerVaisseau(colonne, ligne);
            infoFlotte(couleur);
            changeImageVaisseaux();
            if (f.partieFinie())
            {
                finJeu();
            }
            // Autoriser le tir
            if (f.estCharge() == false)
            {
                while(!f.flotteSuivante());
                peutLancerDes = true;
                String couleur_nouveau_vaisseau = f.couleurVaisseauCourant();
                changeFondPlateau(couleur_nouveau_vaisseau);
            }
            else modeTir = 1;
        }

        /**
         * Change la couleur du fond du jeu par la couleur du joueur
         */
        public void changeFondPlateau(String couleur)
        {
            if (couleur == "Vert")
                jeu.Background = Brushes.Green;
            if (couleur == "Rouge")
                jeu.Background = Brushes.Red;
            if (couleur == "Bleu")
                jeu.Background = Brushes.Blue;
            if (couleur == "Jaune")
                jeu.Background = Brushes.Yellow;
        }

        /*
         * Affiche un message si le jeu est fini
         */
        public void finJeu()
        {
            MessageBox.Show("Partie finie !!! Le gagnant est le joueur " + f.gagnant() + " !");

            // Creation de la fenêtre Menu
            MainWindow fenetreMenu = new MainWindow();
            fenetreMenu.Show();

            // Fermeture de la fenêtre Jeu
            this.Close();
        }
       
    }
}
